{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Target guided ordinal encoding\n",
    "\n",
    "In the previous lectures in this section on how to engineer the labels of categorical variables, we learnt how to convert a label into a number, by using one hot encoding or replacing by frequency or counts. These methods are simple, make no assumptions and work generally well in different scenarios.\n",
    "\n",
    "There are however methods that allow us to capture information while pre-processing the labels of categorical variables. These methods include:\n",
    "\n",
    "- Ordering the labels according to the target\n",
    "- Replacing labels by the risk (of the target)\n",
    "- Replacing the labels by the joint probability of the target being 1 or 0\n",
    "- Weight of evidence.\n",
    "\n",
    "### Monotonicity\n",
    "\n",
    "All these methods create a monotonic relationship between the categorical variable and the target. A monotonic relationship is a relationship that does one of the following: (1) as the value of one variable increases, so does the value of the other variable; or (2) as the value of one variable increases, the other variable value decreases. In this case, as the value of the independent variable (predictor) increases, so does the target, or conversely, as the value of the variable increases, the target decreases.\n",
    "\n",
    "In general:\n",
    "\n",
    "### Advantages\n",
    "\n",
    "- Capture information within the label, therefore rendering more predictive features\n",
    "- Create a monotonic relationship between the variable and the target\n",
    "- Do not expand the feature space\n",
    "\n",
    "### Disadvantage\n",
    "\n",
    "- Prone to cause over-fitting\n",
    "\n",
    "\n",
    "### Note\n",
    "\n",
    "The methods discussed in this and the coming 3 lectures can be also used on numerical variables, after discretisation. This creates a monotonic relationship between the numerical variable and the target, and therefore improves the performance of linear models. I will discuss this in more detail in the section \"Discretisation\".\n",
    "\n",
    "### Ordering  labels according to the target\n",
    "\n",
    "Ordering the labels according to the target means assigning a number to the label, but this numbering, this ordering, is informed by the mean of the target within the label.\n",
    "\n",
    "Briefly, we calculate the mean of the target for each label/category, then we order the labels according to these mean from smallest to biggest, and we number them accordingly.\n",
    "\n",
    "See the example below:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Cabin</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>C85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>C123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived Cabin\n",
       "0         0   NaN\n",
       "1         1   C85\n",
       "2         1   NaN\n",
       "3         1  C123\n",
       "4         0   NaN"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# let's load again the titanic dataset\n",
    "\n",
    "data = pd.read_csv('titanic.csv', usecols=['Cabin', 'Survived'])\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Cabin</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>Missing</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>C85</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>Missing</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>C123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>Missing</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived    Cabin\n",
       "0         0  Missing\n",
       "1         1      C85\n",
       "2         1  Missing\n",
       "3         1     C123\n",
       "4         0  Missing"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# let's first fill NA values with an additional label\n",
    "\n",
    "data.Cabin.fillna('Missing', inplace=True)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "148"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Cabin has indeed a lot of labels, here for simplicity, I will capture the first letter of the cabin, \n",
    "# but the procedure could be done as well without any prior variable manipulation\n",
    "\n",
    "len(data.Cabin.unique()) # check number of different labels in Cabin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Cabin</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>M</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>M</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>M</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived Cabin\n",
       "0         0     M\n",
       "1         1     C\n",
       "2         1     M\n",
       "3         1     C\n",
       "4         0     M"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Now we extract the first letter of the cabin\n",
    "\n",
    "data['Cabin'] = data['Cabin'].astype(str).str[0]\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['M', 'C', 'E', 'G', 'D', 'A', 'B', 'F', 'T'], dtype=object)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check the labels again, we have much less categories in Cabin now\n",
    "\n",
    "data.Cabin.unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Important\n",
    "\n",
    "The ordering of the labels should be done considering the target ONLY on the training set, and then expanded it to the test set.\n",
    "See below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((623, 2), (268, 2))"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let's separate into train and test set\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    data[['Cabin', 'Survived']], data.Survived, test_size=0.3, random_state=0)\n",
    "\n",
    "X_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Cabin\n",
       "T    0.000000\n",
       "M    0.303609\n",
       "A    0.428571\n",
       "G    0.500000\n",
       "C    0.571429\n",
       "F    0.666667\n",
       "D    0.692308\n",
       "E    0.740741\n",
       "B    0.774194\n",
       "Name: Survived, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# now we order the labels according to the mean target value\n",
    "\n",
    "X_train.groupby(['Cabin'])['Survived'].mean().sort_values()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['T', 'M', 'A', 'G', 'C', 'F', 'D', 'E', 'B'], dtype='object', name='Cabin')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# now we generate an ordered list with the labels\n",
    "\n",
    "X_train.groupby(['Cabin'])['Survived'].mean().sort_values().index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# now we generate an ordered list with the labels (same as above but we capture the list in a variable)\n",
    "\n",
    "ordered_labels = X_train.groupby(['Cabin'])['Survived'].mean().sort_values().index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'A': 2, 'B': 8, 'C': 4, 'D': 6, 'E': 7, 'F': 5, 'G': 3, 'M': 1, 'T': 0}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# and now we create a dictionary that maps each label to the number\n",
    "\n",
    "ordinal_label = {k:i for i, k in enumerate(ordered_labels, 0)} \n",
    "ordinal_label"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This method assigned the number 0 to T, the category with the lowest target mean, and 8 to B, the category with the highest target mean."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# replace the labels with the ordered numbers\n",
    "# both in train and test set (note that we created the dictionary only using the training set)\n",
    "\n",
    "X_train['Cabin_ordered'] = X_train.Cabin.map(ordinal_label)\n",
    "X_test['Cabin_ordered'] = X_test.Cabin.map(ordinal_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Cabin_ordered</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>857</th>\n",
       "      <td>E</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52</th>\n",
       "      <td>D</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>386</th>\n",
       "      <td>M</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>124</th>\n",
       "      <td>D</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>578</th>\n",
       "      <td>M</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Cabin  Survived  Cabin_ordered\n",
       "857     E         1              7\n",
       "52      D         1              6\n",
       "386     M         0              1\n",
       "124     D         0              6\n",
       "578     M         0              1"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check the results\n",
    "\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0xc9021c0550>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nDQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc900de2908>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# let's inspect the newly created monotonic relationship with the target\n",
    "\n",
    "#first we plot the original variable for comparison, there is no monotonic relationship\n",
    "\n",
    "fig = plt.figure()\n",
    "fig = X_train.groupby(['Cabin'])['Survived'].mean().plot()\n",
    "fig.set_title('Normal relationship between variable and target')\n",
    "fig.set_ylabel('Survived')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0xc9022c6b70>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n/H8dDUS5BtIIvQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc9022531d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot the transformed result: the monotonic variable\n",
    "\n",
    "fig = plt.figure()\n",
    "fig = X_train.groupby(['Cabin_ordered'])['Survived'].mean().plot()\n",
    "fig.set_title('Monotonic relationship between variable and target')\n",
    "fig.set_ylabel('Survived')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There is now a monotonic relationship between the variable Cabin and probability of survival. The higher the Cabin number, the more likely the person was to survive.\n",
    "\n",
    "### Note\n",
    "\n",
    "Monotonic does not mean strictly linear. Monotonic means that it increases constantly, or it decreases constantly.\n",
    "\n",
    "Replacing categorical labels with this code and method will generate missing values for categories present in the test set that were not seen in the training set. Therefore it is extremely important to handle rare labels before-hand, as we explained in previous sections."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": "block",
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
